package com.yangfan.thread.thread_wangwenjun01;


/**
 * @description: 学习王文君线程课程，线程的生命周期的演示
 * @author: yangfan
 * @date: Created in 2020/1/21 0021 15:17
 * @modified By:
 */

import java.util.concurrent.Callable;
import java.util.concurrent.Executors;

/**
 * 复习内容:
 *
 * 线程的创建有4中：
 * 1.继承 {@link Thread} 类 重写 run() 方法
 * 2.实现 {@link Runnable} 接口 实现 run()方法
 * 3.实现 {@link Callable} 接口 实现 call方法
 * 4.使用线程池 创建 线程  {@link Executors} 工具类创建合适大小的 线程池
 *
 *
 * 线程的生命 周期:
 *
 * new      线程创建出来的状态。
 * runnable 线程调用start() 方法后 线程就会进入这个 状态 随时有可能执行，只要有CPU分配的时间片 就会进入 running的状态
 * running  线程的运行就会进入这个状态。 线程运行中 如果CUP把时间片又分给了别人 就会进入 runnable 状态 等待 CUP 重新分配时间片再次 执行
 * block    如果当前线程 被加了锁 怎会进入 这个状态  取消加锁后 会进入(runnable) 准备状态 再次等待 时间片 拿到后 运行
 * terminated  线程死亡 ， runnable、running、block线程都有可能会进入 死亡状态
 */
public class ThreadFound extends Thread{

    /**
     * 继承 Thread 方式 实现一个  银行  4个窗口 叫号功能
     */

    private final String threadName; //当前线程名称
    private static final int MAX_TICKET_NUM = 50;//最大的叫号数
    private static int index = 1;// 当前叫号数 默认起始值为 1

    ThreadFound(String threadName){
        this.threadName = threadName;
    }

    @Override
    public void run() {
        while (index <= ThreadFound.MAX_TICKET_NUM){
            System.out.println("窗口"+threadName+"对进行叫号:"+ (++index));
        }
    }


    //三个线程一起叫号
    public static void main(String[] args) {
        ThreadFound t1 = new ThreadFound("A");
        t1.start();

        ThreadFound t2 = new ThreadFound("B");
        t2.start();

        ThreadFound t3 = new ThreadFound("C");
        t3.start();
    }



}
